package com.xsd.singleton;

/**
 * @Description: 单例模式 双重检查 懒汉式线程安全
 * @Author: zhoufuzong
 * @Created: 2021-01-23 12:41:51
 * @Version: 1.1.0
 */

/**
 * 优缺点说明：
 * 1) Double-Check概念是多线程开发中常使用到的，如代码中所示，我们进行了两
 * 次if (singleton == null)检查，这样就可以保证线程安全了。
 * 2) 这样，实例化代码只用执行一次，后面再次访问时，判断if (singleton == null)，
 * 直接return实例化对象，也避免的反复进行方法同步.
 * 3) 线程安全；延迟加载；效率较高
 * 4) 结论：在实际开发中，推荐使用这种单例设计模式
 */

public class SingletonTest6 {
    public static void main(String[] args) {
        Singleton6 singleton6 = Singleton6.getInstance();
        Singleton6 singleton61 = Singleton6.getInstance();
        System.out.println(singleton6 == singleton61);
    }
}

class Singleton6{
    // volatile 多线程时一个线程修改了 volatile 修饰的变量时，另一个线程能立马读取到这个新值
    private  static volatile   Singleton6 instance;

    private Singleton6 (){

    }

    // 提供一个静态的公有方法，加入双重检查代码，解决线程安全问题，同时解决懒加载问题
    public static Singleton6 getInstance() {
        if (instance==null){
            synchronized (Singleton5.class){
                if (instance==null){
                    instance =new Singleton6();
                }

            }
        }
        return instance;
    }
}